コンソールで動くテトリスを実装するチュートリアル その2 ゲームらしい画面を描画する
この作業用リポジトリは以下
準備
その1で書いたコードを複製する
code:sh
cp src/tetris1.nim src/tetris2.nim
nimbleファイルに複製したファイルを追記
code:console_tetris_tutorial.nimble
実装
コンソールでいい感じのUIを表示するためのライブラリを導入する
上記ライブラリをインストールする設定をnimbleファイルに追記
code:console_tetris_tutorial.nimble
requires "illwill >= 0.1.0" # 追記
一旦ビルド確認
code:bash
nimble build
illwillを使うように修正する
code:tetris2.nim
from os import sleep
import illwill
type
const
initialBoard*: Board = @[
@1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, @1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, @1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, @1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, @1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, @1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, @1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, @1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, @1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, @1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, @1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, @1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, @1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, @1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, @1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, @1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, @1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, @1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, @1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, ]
proc color(n: int): BackgroundColor =
case n
of 0: bgBlack
of 1: bgWhite
else: bgBlack
proc drawBoard(tb: var TerminalBuffer, board: Board) =
for y, row in board:
# 行を描画
for x, cell in row:
let c = cell.color()
tb.setBackgroundColor(c)
tb.write(x*2, y, " ")
tb.resetAttributes()
proc exitProc() {.noconv.} =
## 終了処理
illwillDeinit()
showCursor()
# illwillの初期化
illwillInit(fullscreen=true)
# Ctrl-Cでプログラムが中断したときにプロシージャを呼ぶ
setControlCHook(exitProc)
# カーソルを非表示
hideCursor()
# 画面描画用のバッファ
var tb = newTerminalBuffer(terminalWidth(), terminalHeight())
while true:
tb.drawBoard(initialBoard)
tb.display()
sleep 1000 # ミリ秒
差分
内容
illwillでは画面への描画をすべてTerminalBufferを通して行う
TerminalBufferにwriteしてdisplayするとコンソールに反映される
その1では画面に垂流していた文字を、コンソール上で表現できる色を使うことでUIを表現する
TerminalBufferではsetBackgroundColorで色を設定し、write時に色つきで文字が書きこまれる
code:nim
tb.setBackgroundColor(c)
tb.write(x*2, y, " ")
tb.resetAttributes()
現状独自に定義したBoard型では 0 と 1 が出現する
これをBackgroundColor型に変換するcolorプロシージャを独自に定義する
code:nim
proc color(n: int): BackgroundColor =
case n
of 0: bgBlack
of 1: bgWhite
else: bgBlack
これを利用して、画面にBoardを描画するdrawBoardプロシージャを定義する
code:nim
proc drawBoard(tb: var TerminalBuffer, board: Board) =
for y, row in board:
# 行を描画
for x, cell in row:
let c = cell.color()
tb.setBackgroundColor(c)
tb.write(x*2, y, " ")
tb.resetAttributes()
あとは前述のコード全体のコメントの通り
実行
code:sh
nimble build
./bin/tetris2
結果は以下
https://gyazo.com/a68b1bc941d639647fba63dfe30b2198